"""
单进程、单线程也可以实现处理多任务，类似于gevent的原理
"""
import socket
import time


def main():
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_socket.bind(("", 7890))
    tcp_socket.listen(128)
    # socket默认为堵塞式等待接收连接，有连接则返回客户端socket，设置为非堵塞式
    tcp_socket.setblocking(False)
    client_socket_list = list()
    while True:
        time.sleep(0.5)
        # 由于socket设置为非堵塞式，如果没有客户端连接则报异常
        try:
            client_socket, client_addr = tcp_socket.accept()
        except Exception as ret:
            # 出现异常说明没有客户端到来
            print("--暂时没有客户端连接--")
        else:
            # 没有发生异常表明有新的客户端连接
            print("--有新的客户端连接--")
            # 将客户端添加到集合中用于遍历进行通讯
            # recv默认也是堵塞方法，为了不影响其他客户端通讯此处设置为非堵塞
            # client_socket.recv()
            client_socket.setblocking(False)
            client_socket_list.append(client_socket)

        # 遍历集合，如果有客户端则通讯
        for client_socket in client_socket_list:
            # 由于client_socket设置为非堵塞，如果没有进行通讯则会出现异常
            try:
                request = client_socket.recv(1024)
            except Exception as ret:
                print("--客户端还没有进行通信--")
            else:
                # 客户端和服务端通信，可能是发送过来数据可能客户端close
                print(request)
                if request:
                    print("--客户端发来数据")
                else:
                    print("--一个客户端离开了--")
                    # 客户端调用close方法
                    client_socket.close()
                    # 从集合中删除socket
                    client_socket_list.remove(client_socket)


if __name__ == '__main__':
    main()
